// semaphore.h
// 信号量
#pragma once
#include "../include/std.h"
#ifdef LINUX
#include <semaphore.h>
#endif

class CSemaphore
{
public:
    CSemaphore() { Construct(); };
    ~CSemaphore() { Destruct(); };

    int Init(int iMax = 1, int iInit = 0);
    /*初始化
    iMax	最大信号数量
    iInit	初始信号数量
    */
    int Recycle()
    {
        Destruct();
        return Construct();
    };

    int Send(int iCount = 1);
    /*发送信号
    iCount 信号数量
    说明：没有参数和状态合法性检测。
    */

    int Recv(int iTimeout = -1);
    /*接受信号
    iTimeout	超时时间，单位秒。-1表示无限等待。
    说明：没有参数和状态合法性检测。
    */
protected:
    // #ifdef WINDOWS
    HANDLE m_hSem; // WINDOWS下为信号量句柄。LINUX为m_stSem地址，用于判断是否初始化。
    // #endif
#ifdef LINUX
    sem_t m_stSem;
#endif
    int m_iMax;

    int Construct();
    int Destruct();
};
